home *** CD-ROM | disk | FTP | other *** search
Text File | 1992-08-17 | 4.4 KB | 179 lines | [TEXT/PJMM] |
- unit InstallFKEYXCMD;
- { in HyperCard }
- { InstallFKEY sourceFile,FKEYResID,overwriteBool }
- { Rob Spencer 8/17/92 }
-
- { CopyRes doesn't work; it probably tries to close the System file. }
-
- interface
- uses
- HyperXCMD;
- procedure main (paramPtr: XCmdPtr);
-
- implementation
-
- procedure main (paramPtr: XCmdPtr);
- const
- kAuthorStr = 'Rob Spencer August 1992';
- kFormStr = 'form: InstallFKEY sourceFileName,FKEYResID[,overwriteBool]';
- kBadFileStr = 'FKEY source file unknown';
- kNoFKEYStr = 'FKEY not found in source file';
- kExistsStr = 'FKEY already exists in System';
- var
- overwrite: boolean;
- sourceFileName, tempStr: str255;
- tempLong: longint;
- resID: integer;
-
- {-----------------------------------}
-
- procedure HandleError (myStr: str255);
- begin
- case myStr[1] of
- '!':
- myStr := kAuthorStr;
- '?':
- myStr := kFormStr;
- otherwise
- myStr := concat('error: ', myStr);
- end;
- paramPtr^.returnValue := PasToZero(paramPtr, myStr);
- exit(main);
- end;
-
- {-----------------------------------}
-
- procedure HandleErrorByNumber (err: OSErr);
- var
- tempStr: str255;
- begin
- NumToString(err, tempStr);
- tempStr := concat('unspecified # ', tempStr);
- HandleError(tempStr);
- end;
-
- {-----------------------------------}
-
-
- procedure CopyFKEY (sourceFileName: str255; resID: integer; overwrite: boolean);
- { See Knaster, How to Write Mac Software, pp. 328-333. }
- var
- sourceResFileNum, oldResFileNum, destFileRefNum: integer;
- tempH, FKEYHandle: handle;
- err: OSErr;
- needToClose, done: boolean;
- begin
-
- oldResFileNum := CurResFile;
-
- { Get the FKEY and detach it from its source file. }
-
- sourceResFileNum := OpenResFile(sourceFileName);
- if sourceResFileNum = -1 then
- HandleError(kBadFileStr);
-
- { If the res file was already open, OpenResFile will not put it at the top. }
-
- if (sourceResFileNum = CurResFile) and (sourceResFileNum <> oldResFileNum) then
- needToClose := true
- else
- needToClose := false;
-
- UseResFile(sourceResFileNum);
- FKEYHandle := GetResource('FKEY', resId);
- if (ResError <> noErr) or (FKEYHandle = nil) then
- begin
- if needToClose then
- CloseResFile(sourceResFileNum);
- HandleError(kNoFKEYStr);
- end;
-
- DetachResource(FKEYHandle);
- if needToClose then
- CloseResFile(sourceResFileNum);
- MoveHHi(FKEYHandle);
-
- { Now copy it to the System file. }
-
- destFileRefNum := 0; { the System file is our destination }
-
- UseResFile(destFileRefNum);
-
- { Check for pre-existing FKEYs with our id. }
-
- done := false;
- repeat { remove all resources with our type & id }
- tempH := Get1Resource('FKEY', resID);
- if (tempH = nil) or (HomeResFile(tempH) <> destFileRefNum) then
- done := true
- else
- begin
- if not overwrite then
- begin
- done := true;
- HandleError(kExistsStr);
- end
- else
- begin
- RmveResource(tempH);
- DisposHandle(tempH);
- end;
- end;
- until done;
-
- AddResource(FKEYHandle, 'FKEY', resID, ''); { add our resource }
-
- if ResError <> noErr then
- HandleErrorByNumber(ResError)
- else
- begin
- ChangedResource(FKEYHandle);
- UpdateResFile(destFileRefNum); { out to disk now... }
- if ResError <> noErr then
- HandleErrorByNumber(ResError)
- end;
-
- UseResFile(oldResFileNum);
- end;
-
- {------------------ main -----------------}
-
- begin
-
- { Get all parameters. }
-
- if paramPtr^.paramCount < 2 then
- HandleError('?');
- if (paramPtr^.params[1] = nil) or (paramPtr^.params[2] = nil) then
- HandleError('?');
-
- Hlock(paramPtr^.params[1]);
- ZeroToPas(paramPtr, paramPtr^.params[1]^, sourceFileName);
- Hunlock(paramPtr^.params[1]);
-
- if sourceFileName = '' then
- HandleError('?')
- else if sourceFileName[1] in ['!', '?'] then
- HandleError(sourceFileName[1]);
-
- Hlock(paramPtr^.params[2]);
- ZeroToPas(paramPtr, paramPtr^.params[2]^, tempStr);
- Hunlock(paramPtr^.params[2]);
- StringToNum(tempStr, tempLong);
- resId := tempLong;
-
- overwrite := true;
- if paramPtr^.paramCount > 2 then
- begin
- Hlock(paramPtr^.params[3]);
- ZeroToPas(paramPtr, paramPtr^.params[3]^, tempStr);
- Hunlock(paramPtr^.params[3]);
- if tempStr <> '' then
- if tempStr[1] in ['F', 'f', 'N', 'n'] then
- overwrite := false;
- end;
-
- CopyFKEY(sourceFileName, resID, overwrite); { Do the work. }
- paramPtr^.returnValue := nil;
- end;
- end.